package com.raymond.cmpp.common.thread;

import com.raymond.cmpp.common.utils.StaticValues;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 循环线程
 *
 * @author :  raymond
 * @version :  V1.0
 * @date :  2021-08-05 15:03
 */
public abstract class BaseCirculationThread extends Thread {
    private final static Logger logger = LoggerFactory.getLogger(BaseCirculationThread.class);

    /**当前线程退出标识**/
    private boolean currentThreadIsExit = false;

    @Override
    public final void run() {
        super.run();
        init();
        while (!StaticValues.IS_EXIT && !currentThreadIsExit) {
            try {
                execute();
            } catch (Exception e) {
                logger.error("循环线程异常,{}", getName(), e);
            }
        }
        after();
    }

    /**
     * 循环任务
     */
    protected abstract void execute();

    /**
     * 初始化方法,当前线程启动运行一次
     */
    protected void init() {
        logger.info("循环线程已启动,{}", getName());
    }

    /**
     * 线程关闭运行的方法
     */
    protected void after() {
        logger.info("循环线程已关闭,{}", getName());
    }

    /**
     * 退出当前循环线程
     * 调用此方法后不再运行循环任务
     */
    public final void currentThreadExit() {
        this.currentThreadIsExit = true;
    }
}
